home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / EDITOREN / 7UP_PD / USERDEF.C < prev    next >
C/C++ Source or Header  |  1998-03-14  |  47KB  |  1,856 lines

  1. /* benutzerdefinierte AES Objekte */
  2. /*****************************************************************************
  3. *
  4. *                                              7UP
  5. *                                      Modul: USERDEF.C
  6. *                             (c) by mt '90
  7. *
  8. *****************************************************************************/
  9.  
  10. #define RSC_CREATE 1
  11.  
  12. #include <portab.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <aes.h>
  17. #include <vdi.h>
  18.  
  19. #include "windows.h"
  20. #include "7up.h"
  21.  
  22. #include "language.h"
  23. #include "toolbar.h"
  24.  
  25. #define DESK        0
  26.  
  27. #define DRBUTTON     0x0001                     /* user defined objects */
  28. #define DCHECKBOX  0x0002
  29. #define DALTBUTTON 0x0003
  30. #define DULINE        0x0004
  31. #define DEAR         0x0005
  32. #define DCIRCLE     0x0006
  33. #define DDLINE        0x0007
  34. #define DSELFONT   0x0008
  35. #define D3DBOX     0x0009
  36. #define DHEADER     0x0020
  37. #define DFONT        0x0080
  38. #define DTABBAR    0x00FF
  39.  
  40. #define FLAGS9       0x0200
  41. #define FLAGS10      0x0400
  42. #define FLAGS14    0x4000
  43. #define FLAGS15    0x8000
  44.  
  45.  
  46. int threedee; /* lange Überschriftenunterstreichung */
  47. int dialbgcolor=WHITE;
  48. int actbutcolor=WHITE;
  49.  
  50. #if MSDOS
  51. EXTERN PARMBLK    *fardr_start     _((VOID));
  52. EXTERN VOID        fardr_end         _((WORD state));
  53. #endif
  54.  
  55. extern int userhandle;
  56. extern int boxh,boxw,norm_point,small_point;
  57. extern int xdesk,ydesk,wdesk,hdesk;
  58.  
  59. extern OBJECT *userimg;
  60.  
  61. #if MSDOS
  62. LOCAL WORD         draw_checkbox    _((VOID));
  63. LOCAL WORD         draw_radio        _((VOID));
  64. LOCAL WORD         draw_font        _((VOID));
  65. LOCAL WORD         draw_uline        _((VOID));
  66. LOCAL WORD         draw_dline        _((VOID));
  67. LOCAL WORD         draw_selfont    _((VOID));
  68. LOCAL WORD         draw_3Dbox        _((VOID));
  69. LOCAL WORD         draw_tabbar    _((VOID));
  70. #else
  71. LOCAL WORD CDECL draw_checkbox    _((FAR PARMBLK *pb));
  72. LOCAL WORD CDECL draw_radio     _((FAR PARMBLK *pb));
  73. LOCAL WORD CDECL draw_font         _((FAR PARMBLK *pb));
  74. LOCAL WORD CDECL draw_uline        _((FAR PARMBLK *pb));
  75. LOCAL WORD CDECL draw_dline        _((FAR PARMBLK *pb));
  76. LOCAL WORD CDECL draw_selfont        _((FAR PARMBLK *pb));
  77. LOCAL WORD CDECL draw_3Dbox        _((FAR PARMBLK *pb));
  78. LOCAL WORD CDECL draw_tabbar        _((FAR PARMBLK *pb));
  79. #endif
  80.  
  81. LOCAL  USERBLK      font_blk;         /* used for 7UP fonts */
  82. LOCAL  USERBLK      ear_blk;
  83. LOCAL  USERBLK      circle_blk;
  84. LOCAL  USERBLK      dline_blk;
  85. LOCAL  USERBLK      selfont_blk;
  86. LOCAL  USERBLK      threeDbox_blk;
  87.  
  88. LOCAL VOID set_clip   (WORD handle, WORD x, WORD y, WORD w, WORD h);
  89. LOCAL VOID reset_clip (WORD handle, WORD x, WORD y, WORD w, WORD h);
  90.  
  91. /*********************************************************************/
  92.  
  93. LOCAL void vdi_fix (FDB *pfd, void *theaddr, int wb, int h)
  94. {
  95.   pfd->mp  = theaddr;
  96.   pfd->fwp = wb << 3;
  97.   pfd->fh  = h;
  98.   pfd->fww = wb >> 1;
  99.   pfd->np  = 1;
  100. } /* vdi_fix */
  101.  
  102. LOCAL void vdi_trans (int *saddr, int swb, int *daddr, int dwb, int h)
  103. {
  104.   MFDB src, dst;
  105.  
  106.   vdi_fix (&src, saddr, swb, h);
  107.   src.ff = TRUE;
  108.  
  109.   vdi_fix (&dst, daddr, dwb, h);
  110.   dst.ff = FALSE;
  111.  
  112.   vr_trnfm (userhandle, &src, &dst);
  113. } /* vdi_trans */
  114.  
  115. LOCAL void trans_gimage (OBJECT *tree, int obj)
  116. {
  117.   ICONBLK *piconblk;
  118.   BITBLK  *pbitblk;
  119.   int        *taddr;
  120.   int        wb, hl, type;
  121.  
  122.   type = (tree [obj].ob_type & 0xFF);
  123.   if (type == G_ICON)
  124.   {
  125.      piconblk = (ICONBLK *)tree [obj].ob_spec;
  126.      taddr     = piconblk->ib_pmask;
  127.      wb         = piconblk->ib_wicon;
  128.      wb         = wb >> 3;
  129.      hl         = piconblk->ib_hicon;
  130.      vdi_trans (taddr, wb, taddr, wb, hl);
  131.      taddr = piconblk->ib_pdata;
  132.   } /* if */
  133.   else
  134.   {
  135.      pbitblk = (BITBLK *)tree [obj].ob_spec;
  136.      taddr    = pbitblk->bi_pdata;
  137.      wb        = pbitblk->bi_wb;
  138.      hl        = pbitblk->bi_hl;
  139.   } /* else */
  140.   vdi_trans (taddr, wb, taddr, wb, hl);
  141. } /* trans_gimage */
  142.  
  143. /*****************************************************************************/
  144. LOCAL VOID set_clip (handle, x, y, w, h)
  145. WORD handle, x, y, w, h;
  146.  
  147. {
  148.   WORD pxy [4];
  149.  
  150.   pxy [0] = x;
  151.   pxy [1] = y;
  152.   pxy [2] = x + w - 1;
  153.   pxy [3] = y + h - 1;
  154.  
  155.   vs_clip (handle, TRUE, pxy);
  156. } /* set_clip */
  157.  
  158. LOCAL VOID reset_clip (handle, x, y, w, h)
  159. WORD handle, x, y, w, h;
  160.  
  161. {
  162.   WORD pxy [4];
  163.  
  164.   pxy [0] = x;
  165.   pxy [1] = y;
  166.   pxy [2] = x + w - 1;
  167.   pxy [3] = y + h - 1;
  168.  
  169.   vs_clip (handle, FALSE, pxy);
  170. } /* set_clip */
  171.  
  172. /*****************************************************************************/
  173. /* Zeichnet tastaturbedienbare Exitbuttons                                                             */
  174. /*****************************************************************************/
  175.  
  176. #define odd(i) ((i)&1)
  177.  
  178. #if MSDOS
  179. LOCAL WORD draw_altbutton ()
  180. {
  181.   PARMBLK *pb = fardr_start();
  182. #else
  183. LOCAL WORD CDECL draw_altbutton (PARMBLK *pb)
  184. {
  185. #endif
  186.  
  187.   WORD     ob_x, ob_y, ob_width, ob_height;
  188.   BOOLEAN selected, changed;
  189.   WORD     pxy [10];
  190.   int        i,cx,cy,cw,ch,ret,l_width;
  191.   char     *cp,string[32];
  192.  
  193.   ob_x        = pb->pb_x+2;
  194.   ob_y        = pb->pb_y+2;
  195.   ob_width  = pb->pb_w-4;
  196.   ob_height = pb->pb_h-4;
  197.  
  198.   selected  = pb->pb_currstate & SELECTED;
  199.   changed    = (pb->pb_currstate ^ pb->pb_prevstate) & SELECTED;
  200.  
  201.   vsl_type (userhandle, SOLID);
  202.   vsl_ends (userhandle, SQUARED, SQUARED);
  203.   vsl_width (userhandle, l_width=1);
  204.   vsl_color (userhandle, BLACK);
  205.   vsf_interior(userhandle,FIS_SOLID); /* Füllung */
  206.   vst_alignment(userhandle,0,5,&ret,&ret); /* Ausrichtung */
  207.   vswr_mode (userhandle, MD_REPLACE);
  208.  
  209.   if(pb->pb_tree[pb->pb_obj].ob_flags & EXIT)
  210.   {
  211.       l_width=2;
  212.   }
  213.   if(pb->pb_tree[pb->pb_obj].ob_flags & DEFAULT)
  214.   {
  215.       l_width=3;
  216.   }
  217.  
  218.   set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  219.  
  220.   strcpy(string,(char *)((TEDINFO *)pb->pb_parm)->te_ptext);
  221.   if((cp=strchr(string,'_'))!=NULL)
  222.       strcpy(cp,&cp[1]);
  223.  
  224.   if(threedee && !strcmp(KHILFE,string)) /* Hilfeknopf ein Pixel breit */
  225.         l_width=1;
  226.       
  227.   if (! changed) /* it was an objc_draw, so draw button */
  228.   {
  229.      for(i=0; i<l_width; i++)
  230.      {
  231.          pxy [0] = ob_x -i;
  232.          pxy [1] = ob_y -i;
  233.          pxy [2] = ob_x + ob_width  - 1 +i;
  234.          pxy [3] = pxy [1];
  235.          pxy [4] = pxy [2];
  236.          pxy [5] = ob_y + ob_height - 1 +i;
  237.          pxy [6] = pxy [0];
  238.          pxy [7] = pxy [5];
  239.          pxy [8] = pxy [0];
  240.          pxy [9] = pxy [1];
  241.          v_pline (userhandle, 5, pxy);
  242.      }
  243.      pxy[0]=ob_x+1;
  244.      pxy[1]=ob_y+1;
  245.      pxy[2]=ob_x+ob_width-2;
  246.      pxy[3]=ob_y+ob_height-2;
  247.      if(selected)
  248.      {
  249.         vsf_color(userhandle,BLACK);          /* farbe  */
  250.         vst_color(userhandle,WHITE);          /* farbe  */
  251.      }
  252.      else
  253.      {
  254.          if(threedee) /*3D*/
  255.             vsf_color(userhandle,actbutcolor);          /* farbe  */
  256.         else
  257.             vsf_color(userhandle,WHITE);          /* farbe  */
  258.         vst_color(userhandle,BLACK);          /* farbe  */
  259.      }
  260.      vr_recfl(userhandle,pxy);      /* weißes rechteck in workspace */
  261.  
  262.     vst_color (userhandle, BLACK);
  263.      vswr_mode (userhandle, MD_TRANS); /*3D (XOR) */
  264.  
  265.      if(((TEDINFO *)pb->pb_parm)->te_font==IBM)
  266.      {
  267.          vst_point(userhandle,norm_point,&ret,&ret,&cw,&ch);
  268.          cx=pb->pb_x+(pb->pb_w-strlen(string)*cw)/2;
  269.          cy=pb->pb_y+(pb->pb_h-ch)/2-1;
  270.          if(boxh<=8)
  271.              cy++;
  272.          if(threedee) /* 3D-Look */
  273.          {
  274.            if(selected)
  275.            {
  276.                cx++;
  277.                cy++;
  278.            }
  279.        }
  280.          if(threedee) /* 3D-Look */
  281.              v_gtext(userhandle,cx,cy,string);
  282.          else
  283.              v_gtext(userhandle,cx,cy+1,string); /* ein Pixel tiefer */
  284.          if(cp)
  285.          {
  286.              pxy[0]=cx + (cp-string)*cw;
  287.              pxy[1]=cy + ch - 1;
  288.              pxy[2]=cx + (cp-string+1L)*cw - 1;
  289.              pxy[3]=cy + ch - 1;
  290.              vsl_color (userhandle, BLACK);
  291.              if(boxh<=8)
  292.              {
  293.                  pxy[1]++;
  294.                  pxy[3]++;
  295.              }
  296.              if(!threedee) /* kein 3D-Look */
  297.              {
  298.                  pxy[1]++;
  299.                  pxy[3]++;
  300.              }
  301.              v_pline(userhandle,2,pxy);
  302.          }
  303.      }
  304.      else
  305.      {
  306.          vst_height(userhandle,small_point,&ret,&ret,&cw,&ch);
  307.          cx=pb->pb_x+(3*cw);
  308.          cy=pb->pb_y+((boxh>8)?SMALL:SMALL/2-1)-1;
  309.          if(threedee) /* 3D-Look */
  310.          {
  311.            if(selected)
  312.            {
  313.                cx++;
  314.                cy++;
  315.            }
  316.        }
  317.          v_gtext(userhandle,cx,cy,string);
  318.          if(cp)
  319.          {
  320.              pxy[0]=cx + (cp-string)*cw;
  321.              pxy[1]=cy + ch - 4;
  322.              pxy[2]=cx + (cp-string+1L)*cw - 1;
  323.              pxy[3]=cy + ch - 4;
  324.              vsl_color (userhandle, BLACK);
  325.              v_pline(userhandle,2,pxy);
  326.          }
  327.      }
  328.      vswr_mode (userhandle, MD_REPLACE);
  329.      if(threedee) /* 3D-Look */
  330.      {
  331.          vsl_color (userhandle, WHITE);/* oben, links weiß */
  332.          pxy[0]=ob_x+2-1;
  333.          pxy[1]=ob_y+ob_height-2-1;
  334.          pxy[2]=ob_x+2-1;
  335.          pxy[3]=ob_y+2-1;
  336.          pxy[4]=ob_x+ob_width-2-1;
  337.          pxy[5]=ob_y+2-1;
  338.          v_pline (userhandle, 3, pxy); 
  339.  
  340.          vsl_color (userhandle, LBLACK); 
  341.          pxy[0]=ob_x+2;
  342.          pxy[1]=ob_y+ob_height-2;
  343.          pxy[2]=ob_x+ob_width-2;
  344.          pxy[3]=ob_y+ob_height-2;
  345.          pxy[4]=ob_x+ob_width-2;
  346.          pxy[5]=ob_y+2;
  347.          v_pline (userhandle, 3, pxy);/* unten, rechts schwarz */
  348.      }
  349.   }
  350.   else
  351.   {
  352.      if(!threedee) /* kein 3D-Look */
  353.      {
  354.          pxy[0]=ob_x+1;
  355.          pxy[1]=ob_y+1;
  356.          pxy[2]=ob_x+ob_width-2;
  357.          pxy[3]=ob_y+ob_height-2;
  358.          if(selected)
  359.          {
  360.             vsf_color(userhandle,BLACK);          /* farbe  */
  361.          }
  362.          else
  363.          {
  364.             vsf_color(userhandle,WHITE);          /* farbe  */
  365.          }
  366.          vswr_mode(userhandle, MD_XOR);
  367.          vr_recfl(userhandle,pxy);      /* weißes rechteck in workspace */
  368.      }
  369.      else
  370.      {
  371.          pxy[0]=ob_x+1;
  372.          pxy[1]=ob_y+1;
  373.          pxy[2]=ob_x+ob_width-2;
  374.          pxy[3]=ob_y+ob_height-2;
  375.          vsf_color(userhandle,actbutcolor);          /* farbe  */
  376.          vst_color(userhandle,BLACK);          /* farbe  */
  377.            vswr_mode (userhandle, MD_REPLACE); 
  378.          vr_recfl(userhandle,pxy);      /* weißes rechteck in workspace */
  379.     
  380.            vswr_mode (userhandle, MD_TRANS); 
  381.  
  382.          if(((TEDINFO *)pb->pb_parm)->te_font==IBM)
  383.          {
  384.              vst_point(userhandle,norm_point,&ret,&ret,&cw,&ch);
  385.              cx=pb->pb_x+(pb->pb_w-strlen(string)*cw)/2;
  386.              cy=pb->pb_y+(pb->pb_h-ch)/2-1;
  387.              if(boxh<=8)
  388.                  cy++;
  389.            if(selected)
  390.            {
  391.                cx++;
  392.                cy++;
  393.            }
  394.              v_gtext(userhandle,cx,cy,string);
  395.              if(cp)
  396.              {
  397.                  pxy[0]=cx + (cp-string)*cw;
  398.                  pxy[1]=cy + ch - 1;
  399.                  pxy[2]=cx + (cp-string+1L)*cw - 1;
  400.                  pxy[3]=cy + ch - 1;
  401.                  vsl_color (userhandle, BLACK);
  402.                  if(boxh<=8)
  403.                  {
  404.                      pxy[1]++;
  405.                      pxy[3]++;
  406.                  }
  407.                  v_pline(userhandle,2,pxy);
  408.              }
  409.          }
  410.          else
  411.          {
  412.               vst_height(userhandle,small_point,&ret,&ret,&cw,&ch);
  413.              cx=pb->pb_x+(3*cw);
  414.              cy=pb->pb_y+((boxh>8)?SMALL:SMALL/2-1)-1;
  415.            if(selected)
  416.            {
  417.                cx++;
  418.                cy++;
  419.            }
  420.              v_gtext(userhandle,cx,cy,string);
  421.              if(cp)
  422.              {
  423.                  pxy[0]=cx + (cp-string)*cw;
  424.                  pxy[1]=cy + ch - 4;
  425.                  pxy[2]=cx + (cp-string+1L)*cw - 1;
  426.                  pxy[3]=cy + ch - 4;
  427.                  vsl_color (userhandle, BLACK);
  428.                  v_pline(userhandle,2,pxy);
  429.              }
  430.          }
  431.          vswr_mode (userhandle, MD_REPLACE);
  432.          if(selected)
  433.          {
  434.              vsl_color (userhandle, BLACK);/* oben, links schwarz */
  435.              pxy[0]=ob_x+2-1;
  436.              pxy[1]=ob_y+ob_height-2-1;
  437.              pxy[2]=ob_x+2-1;
  438.              pxy[3]=ob_y+2-1;
  439.              pxy[4]=ob_x+ob_width-2-1;
  440.              pxy[5]=ob_y+2-1;
  441.              v_pline (userhandle, 3, pxy); 
  442.  
  443.              vsl_color (userhandle, WHITE);
  444.              pxy[0]=ob_x+2;
  445.              pxy[1]=ob_y+ob_height-2;
  446.              pxy[2]=ob_x+ob_width-2;
  447.              pxy[3]=ob_y+ob_height-2;
  448.              pxy[4]=ob_x+ob_width-2;
  449.              pxy[5]=ob_y+2;
  450.              v_pline (userhandle, 3, pxy);/* unten, rechts weiß */ 
  451.          }
  452.          else
  453.          {
  454.              vsl_color (userhandle, WHITE);/* oben, links weiß */
  455.              pxy[0]=ob_x+2-1;
  456.              pxy[1]=ob_y+ob_height-2-1;
  457.              pxy[2]=ob_x+2-1;
  458.              pxy[3]=ob_y+2-1;
  459.              pxy[4]=ob_x+ob_width-2-1;
  460.              pxy[5]=ob_y+2-1;
  461.              v_pline (userhandle, 3, pxy); 
  462.  
  463.              vsl_color (userhandle, LBLACK); /* dunkelgrau */
  464.              pxy[0]=ob_x+2;
  465.              pxy[1]=ob_y+ob_height-2;
  466.              pxy[2]=ob_x+ob_width-2;
  467.              pxy[3]=ob_y+ob_height-2;
  468.              pxy[4]=ob_x+ob_width-2;
  469.              pxy[5]=ob_y+2;
  470.              v_pline (userhandle, 3, pxy);/* unten, rechts dunkelgrau */
  471.          }
  472.      }
  473.   }
  474.  
  475.   reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  476.  
  477. #if MSDOS
  478.   fardr_end (pb->pb_currstate & ~ SELECTED);
  479. #endif
  480.  
  481.   return (pb->pb_currstate & ~ SELECTED);
  482. } /* draw_altbutton */
  483.  
  484. /*****************************************************************************/
  485. /* Zeichnet ankreuzbare Buttons                                                             */
  486. /*****************************************************************************/
  487. #if MSDOS
  488. LOCAL WORD draw_checkbox ()
  489. {
  490.   PARMBLK *pb = fardr_start();
  491. #else
  492. LOCAL WORD CDECL draw_checkbox (PARMBLK *pb)
  493. {
  494. #endif
  495.  
  496.   WORD     ob_x, ob_y, ob_width, ob_height;
  497.   BOOLEAN disabled, selected, changed;
  498.   WORD     pxy [12];
  499.   int        cw,ch,ret,viele_Farben;
  500.   char     *cp,string[32];
  501.  
  502.   ob_x        = pb->pb_x+1;
  503.   ob_y        = pb->pb_y+1;
  504.   ob_width  = pb->pb_h-2; /* nicht pb_w!!! */  /* 3 */
  505.   ob_height = pb->pb_h-2;                      /* 3 */
  506.   selected  = pb->pb_currstate & SELECTED;
  507.   disabled  = pb->pb_currstate & DISABLED;
  508.   changed    = (pb->pb_currstate ^ pb->pb_prevstate) & SELECTED;
  509.   viele_Farben = mindestens_16_Farben();
  510.  
  511.   set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  512.  
  513.   vsf_perimeter(userhandle,TRUE);
  514.   vsl_type (userhandle, SOLID);
  515.   vsl_ends (userhandle, SQUARED, SQUARED);
  516.   vsl_width (userhandle, 1);
  517.   vsl_color (userhandle, BLACK);
  518.  
  519.   if(threedee && disabled && viele_Farben)
  520.      vst_color (userhandle, WHITE);
  521.   else  
  522.      vst_color (userhandle, BLACK);
  523.  
  524.   vsm_type(userhandle,PM_DOT);
  525.   vswr_mode (userhandle, MD_TRANS);
  526.  
  527.   if (! changed) /* it was an objc_draw, so draw box */
  528.   {
  529.      pxy [0] = ob_x;
  530.      pxy [1] = ob_y + ob_height - 1;
  531.      pxy [2] = ob_x;
  532.      pxy [3] = ob_y;
  533.      pxy [4] = ob_x + ob_width - 1;
  534.      pxy [5] = ob_y;
  535.      v_pline (userhandle, 3, pxy);
  536.  
  537.     if(threedee && viele_Farben)
  538.         vsl_color (userhandle, WHITE);
  539.      pxy [ 6] = ob_x + ob_width - 1;
  540.      pxy [ 7] = ob_y + 1;
  541.      pxy [ 8] = ob_x + ob_width - 1;
  542.      pxy [ 9] = ob_y + ob_height - 1;
  543.      pxy [10] = ob_x + 1;
  544.      pxy [11] = ob_y + ob_height - 1;
  545.      v_pline (userhandle, 3, &pxy[ 6]);
  546.  
  547.     vsl_color (userhandle, BLACK);
  548.  
  549.      strcpy(string,(char *)((TEDINFO *)pb->pb_parm)->te_ptext);
  550.      if((cp=strchr(string,'_'))!=NULL)
  551.          strcpy(cp,&cp[1]);
  552.      vst_alignment(userhandle,0,5,&ret,&ret); /* Ausrichtung */
  553.  
  554.      if(((TEDINFO *)pb->pb_parm)->te_font==IBM)
  555.      {
  556.          vst_point(userhandle,norm_point,&ret,&ret,&cw,&ch);
  557.          if(boxh>8)
  558.          {
  559.              v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y-1,string);
  560.          }
  561.          else
  562.          {
  563.              v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y,string);
  564.          }
  565.          if(cp)
  566.          {
  567.              pxy[0]=pb->pb_x + (cp-string)*cw+(3*cw);
  568.              pxy[1]=pb->pb_y + pb->pb_h - 2;
  569.              pxy[2]=pb->pb_x + (cp-string+1L)*cw+(3*cw) - 1;
  570.              pxy[3]=pb->pb_y + pb->pb_h - 2;
  571.             if(threedee && disabled && viele_Farben)
  572.                vsl_color (userhandle, WHITE);
  573.             else
  574.                  vsl_color (userhandle, BLACK);
  575.              if(boxh<=8)
  576.              {
  577.                  pxy[1]++;
  578.                  pxy[3]++;
  579.              }
  580.              v_pline(userhandle,2,pxy);
  581.          }
  582.      }
  583.      else
  584.      {
  585.          vst_height(userhandle,small_point,&ret,&ret,&cw,&ch);
  586.          v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y+((boxh>8)?SMALL:SMALL/2-1),string);
  587.          if(cp)
  588.          {
  589.              pxy[0]=pb->pb_x + (cp-string)*cw+(3*cw);
  590.              pxy[1]=pb->pb_y + pb->pb_h - 4;
  591.              pxy[2]=pb->pb_x + (cp-string+1L)*cw+(3*cw) - 1;
  592.              pxy[3]=pb->pb_y + pb->pb_h - 4;
  593.             if(threedee && disabled && viele_Farben)
  594.                vsl_color (userhandle, WHITE);
  595.             else
  596.                 vsl_color (userhandle, BLACK);
  597.              if(boxh<=8)
  598.              {
  599.                  pxy[1]+=3;
  600.                  pxy[3]+=3;
  601.              }
  602.              v_pline(userhandle,2,pxy);
  603.          }
  604.      }
  605.   }
  606.  
  607.   if (!selected && !disabled) /* it was an objc_change */
  608.      vsl_color (userhandle, dialbgcolor);
  609.  
  610.   if (selected) /* it was an objc_change */
  611.      vsl_color (userhandle, BLACK);
  612.  
  613.   if (disabled) /* it was an objc_change */
  614.      vsl_color (userhandle, dialbgcolor);
  615.  
  616.   pxy [0] = ob_x + 1;
  617.   pxy [1] = ob_y + 1;
  618.   pxy [2] = ob_x + ob_width - 2;
  619.   pxy [3] = ob_y + ob_height - 2;
  620.   v_pline (userhandle, 2, pxy);
  621.  
  622.   pxy [0] = ob_x + ob_width - 2;
  623.   pxy [1] = ob_y + 1;
  624.   pxy [2] = ob_x + 1;
  625.   pxy [3] = ob_y + ob_height - 2;
  626.   v_pline (userhandle, 2, pxy);
  627.  
  628.   reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  629.  
  630. #if MSDOS
  631.   fardr_end (pb->pb_currstate & ~ SELECTED);
  632. #endif
  633.   if (threedee && viele_Farben)
  634.       return (pb->pb_currstate & ~ (SELECTED|DISABLED));
  635.   else
  636.       return (pb->pb_currstate & ~ SELECTED);
  637. } /* draw_checkbox */
  638.  
  639. /*****************************************************************************/
  640. /* Zeichnet runde Radiobuttons                                                              */
  641. /*****************************************************************************/
  642. #if MSDOS
  643. LOCAL WORD draw_radio ()
  644. {
  645.   PARMBLK *pb = fardr_start();
  646. #else
  647. LOCAL WORD CDECL draw_radio (PARMBLK *pb)
  648. {
  649. #endif
  650.  
  651.   WORD     ob_x, ob_y, ob_height;
  652.   BOOLEAN disabled,selected,changed;
  653.   MFDB     s, d;
  654.   BITBLK  *bitblk;
  655.   WORD     robj; /* radio button object number */
  656.   WORD     pxy [8];
  657.   WORD     index [2];
  658.   int        cw,ch,ret,viele_Farben;
  659.   char     *cp,string[32];
  660.  
  661.   ob_x        = pb->pb_x;
  662.   ob_y        = pb->pb_y;
  663.   ob_height = pb->pb_h;
  664.   disabled  = pb->pb_currstate & DISABLED;
  665.   selected  = pb->pb_currstate & SELECTED;
  666.   changed    = (pb->pb_currstate ^ pb->pb_prevstate) & SELECTED;
  667.   viele_Farben = mindestens_16_Farben();
  668.  
  669.   if(threedee && disabled && viele_Farben)
  670.      vst_color (userhandle, WHITE);
  671.   else  
  672.      vst_color (userhandle, BLACK);
  673.  
  674.   set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  675.  
  676.   if (selected) /* it was an objc_change */
  677.   {
  678.       switch(norm_point)
  679.       {
  680.          case 9:
  681.             robj=RBLSEL;
  682.             break;
  683.          case 10:
  684.             if(threedee)
  685.                 robj=RBHSEL3D;
  686.              else
  687.                 robj=RBHSEL;
  688.             break;
  689.          case 20:
  690.             robj=RBBSEL;
  691.             break;
  692.          default:
  693.             if(threedee)
  694.                 robj=RBHSEL3D;
  695.              else
  696.                 robj=RBHSEL;
  697.             break;
  698.       }
  699.   }
  700.   else
  701.   {
  702.       switch(norm_point)
  703.       {
  704.          case 9:
  705.             robj=RBLNORM;
  706.             break;
  707.          case 10:
  708.             if(threedee)
  709.                 robj=RBHNORM3D;
  710.              else
  711.                 robj=RBHNORM;
  712.             break;
  713.          case 20:
  714.             robj=RBBNORM;
  715.             break;
  716.          default:
  717.             if(threedee)
  718.                 robj=RBHNORM3D;
  719.              else
  720.                 robj=RBHNORM;
  721.             break;
  722.       }
  723.   }
  724.   
  725.   if(threedee)
  726.   {
  727.       bitblk = (BITBLK *)userimg [RBHBG3D].ob_spec;
  728.     
  729.       d.mp  = NULL; /* screen */
  730.       s.mp  = (VOID *)bitblk->bi_pdata;
  731.       s.fwp = bitblk->bi_wb << 3;
  732.       s.fh  = bitblk->bi_hl;
  733.       s.fww = s.fwp/16;
  734.       s.ff  = FALSE;
  735.       s.np  = 1;
  736.     
  737.       pxy [0] = 0;
  738.       pxy [1] = 0;
  739.       pxy [2] = s.fwp - 1;
  740.       pxy [3] = s.fh - 1;
  741.       pxy [4] = ob_x + 1 + (ob_height-bitblk->bi_wb*8)/2-1;/* nicht ob_width! */
  742.       if(boxh<=8)
  743.          pxy [4]+=ob_height/2-1;
  744.       pxy [5] = ob_y + 1 + (ob_height-bitblk->bi_hl)/2-1;
  745.       pxy [6] = ob_x + pxy [2];
  746.       pxy [7] = ob_y + pxy [3];
  747.     
  748.       index [0] = WHITE;
  749.       index [1] = dialbgcolor;
  750.       vrt_cpyfm (userhandle, MD_REPLACE, pxy, &s, &d, index);     /* copy it */
  751.   }
  752.   
  753.   bitblk = (BITBLK *)userimg [robj].ob_spec;
  754.  
  755.   d.mp  = NULL; /* screen */
  756.   s.mp  = (VOID *)bitblk->bi_pdata;
  757.   s.fwp = bitblk->bi_wb << 3;
  758.   s.fh  = bitblk->bi_hl;
  759.   s.fww = s.fwp/16;
  760.   s.ff  = FALSE;
  761.   s.np  = 1;
  762.  
  763.   pxy [0] = 0;
  764.   pxy [1] = 0;
  765.   pxy [2] = s.fwp - 1;
  766.   pxy [3] = s.fh - 1;
  767.   pxy [4] = ob_x + 1 + (ob_height-bitblk->bi_wb*8)/2-1;/* nicht ob_width! */
  768.   if(boxh<=8)
  769.      pxy [4]+=ob_height/2-1;
  770.   pxy [5] = ob_y + 1 + (ob_height-bitblk->bi_hl)/2-1;
  771.   pxy [6] = ob_x + pxy [2];
  772.   pxy [7] = ob_y + pxy [3];
  773.  
  774.   index [0] = BLACK;
  775.   index [1] = dialbgcolor;
  776.  
  777.   vrt_cpyfm (userhandle, threedee?MD_TRANS:MD_REPLACE, pxy, &s, &d, index);     /* copy it */
  778.  
  779.   vswr_mode (userhandle, MD_TRANS);
  780.  
  781.   if(!changed)
  782.   {
  783.      strcpy(string,(char *)((TEDINFO *)pb->pb_parm)->te_ptext);
  784.      if((cp=strchr(string,'_'))!=NULL)
  785.          strcpy(cp,&cp[1]);
  786.      vst_alignment(userhandle,0,5,&ret,&ret); /* Ausrichtung */
  787.  
  788.      if(((TEDINFO *)pb->pb_parm)->te_font==IBM)
  789.      {
  790.          vst_point(userhandle,norm_point,&ret,&ret,&cw,&ch);
  791.          if(boxh>8)
  792.          {
  793.              v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y-1,string);
  794.          }
  795.          else
  796.          {
  797.              v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y,string);
  798.          }
  799.          if(cp)
  800.          {
  801.              pxy[0]=pb->pb_x + (cp-string)*cw+(3*cw);
  802.              pxy[1]=pb->pb_y + pb->pb_h - 2;
  803.              pxy[2]=pb->pb_x + (cp-string+1L)*cw+(3*cw) - 1;
  804.              pxy[3]=pb->pb_y + pb->pb_h - 2;
  805.             if(threedee && disabled && viele_Farben)
  806.                vsl_color (userhandle, WHITE);
  807.             else
  808.                 vsl_color (userhandle, BLACK);
  809.              if(boxh<=8)
  810.              {
  811.                  pxy[1]++;
  812.                  pxy[3]++;
  813.              }
  814.              v_pline(userhandle,2,pxy);
  815.          }
  816.      }
  817.      else
  818.      {
  819.          vst_height(userhandle,small_point,&ret,&ret,&cw,&ch);
  820.          v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y+((boxh>8)?SMALL:SMALL/2-1),string);
  821.          if(cp)
  822.          {
  823.              pxy[0]=pb->pb_x + (cp-string)*cw+(3*cw);
  824.              pxy[1]=pb->pb_y + pb->pb_h - 4;
  825.              pxy[2]=pb->pb_x + (cp-string+1L)*cw+(3*cw) - 1;
  826.              pxy[3]=pb->pb_y + pb->pb_h - 4;
  827.             if(threedee && disabled && viele_Farben)
  828.                vsl_color (userhandle, WHITE);
  829.             else
  830.                 vsl_color (userhandle, BLACK);
  831.              if(boxh<=8)
  832.              {
  833.                  pxy[1]+=3;
  834.                  pxy[3]+=3;
  835.              }
  836.              v_pline(userhandle,2,pxy);
  837.          }
  838.      }
  839.   }
  840.  
  841.   reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  842.  
  843. #if MSDOS
  844.   fardr_end (pb->pb_currstate & ~ SELECTED);
  845. #endif
  846.   if(threedee && viele_Farben)
  847.      return (pb->pb_currstate & ~ (SELECTED|DISABLED));
  848.   else
  849.      return (pb->pb_currstate & ~ SELECTED);
  850. } /* draw_radio */
  851. /*
  852. /*****************************************************************************/
  853. /* Zeichnet runde Radiobuttons mit VDI                NICHT BENUTZT!!!             */
  854. /*****************************************************************************/
  855. #if MSDOS
  856. LOCAL WORD draw_radio ()
  857. {
  858.   PARMBLK *pb = fardr_start();
  859. #else
  860. LOCAL WORD CDECL draw_radio (PARMBLK *pb)
  861. {
  862. #endif
  863.  
  864.   WORD     ob_x, ob_y, ob_height;
  865.   BOOLEAN selected,changed;
  866.   int        cw,ch,ret,pxy[4];
  867.   char     *cp,string[32];
  868.  
  869.   ob_x        = pb->pb_x;
  870.   ob_y        = pb->pb_y;
  871.   ob_height = pb->pb_h;
  872.   selected  = pb->pb_currstate & SELECTED;
  873.   changed    = (pb->pb_currstate ^ pb->pb_prevstate) & SELECTED;
  874.  
  875.   set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  876.  
  877.   vst_color (userhandle, BLACK);
  878.   vswr_mode (userhandle, MD_TRANS);
  879.   vsf_color(userhandle,BLACK);
  880.   vsf_interior(userhandle,FIS_HOLLOW);
  881.   v_ellipse(userhandle,ob_x+ob_height/2-1,ob_y+ob_height/2-1,
  882.                        ob_height/2-1,   ob_height/2-1);
  883.   if(selected)
  884.   {
  885.       vsf_interior(userhandle,FIS_SOLID);
  886.       v_ellipse(userhandle,ob_x+ob_height/2-1,ob_y+ob_height/2-1,
  887.                            ob_height/4,   ob_height/4);
  888.   }
  889.  
  890.   if(!changed)
  891.   {
  892.      strcpy(string,(char *)((TEDINFO *)pb->pb_parm)->te_ptext);
  893.      if((cp=strchr(string,'_'))!=NULL)
  894.          strcpy(cp,&cp[1]);
  895.      vst_alignment(userhandle,0,5,&ret,&ret); /* Ausrichtung */
  896.  
  897.      if(((TEDINFO *)pb->pb_parm)->te_font==IBM)
  898.      {
  899.          vst_point(userhandle,norm_point,&ret,&ret,&cw,&ch);
  900.          if(boxh>8)
  901.          {
  902.              v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y-1,string);
  903.          }
  904.          else
  905.          {
  906.              v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y,string);
  907.          }
  908.          if(cp)
  909.          {
  910.              pxy[0]=pb->pb_x + (cp-string)*cw+(3*cw);
  911.              pxy[1]=pb->pb_y + pb->pb_h - 2;
  912.              pxy[2]=pb->pb_x + (cp-string+1L)*cw+(3*cw) - 1;
  913.              pxy[3]=pb->pb_y + pb->pb_h - 2;
  914.              vsl_color (userhandle, BLACK);
  915.              if(boxh<=8)
  916.              {
  917.                  pxy[1]++;
  918.                  pxy[3]++;
  919.              }
  920.              v_pline(userhandle,2,pxy);
  921.          }
  922.      }
  923.      else
  924.      {
  925.          vst_height(userhandle,small_point,&ret,&ret,&cw,&ch);
  926.          v_gtext(userhandle,pb->pb_x+(3*cw),pb->pb_y+((boxh>8)?SMALL:SMALL/2-1),string);
  927.          if(cp)
  928.          {
  929.              pxy[0]=pb->pb_x + (cp-string)*cw+(3*cw);
  930.              pxy[1]=pb->pb_y + pb->pb_h - 4;
  931.              pxy[2]=pb->pb_x + (cp-string+1L)*cw+(3*cw) - 1;
  932.              pxy[3]=pb->pb_y + pb->pb_h - 4;
  933.              vsl_color (userhandle, BLACK);
  934.              if(boxh<=8)
  935.              {
  936.                  pxy[1]+=3;
  937.                  pxy[3]+=3;
  938.              }
  939.              v_pline(userhandle,2,pxy);
  940.          }
  941.      }
  942.   }
  943.  
  944.   reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  945.  
  946. #if MSDOS
  947.   fardr_end (pb->pb_currstate & ~ SELECTED);
  948. #endif
  949.  
  950.   return (pb->pb_currstate & ~ SELECTED);
  951. } /* draw_radio */
  952. */
  953. /*****************************************************************************/
  954. /* Zeichnet Buttons mit Kreis                                                                */
  955. /*****************************************************************************/
  956. #if MSDOS
  957. LOCAL WORD draw_circle ()
  958. {
  959.     PARMBLK *pb = fardr_start();
  960. #else
  961. LOCAL WORD CDECL draw_circle (PARMBLK *pb)
  962. {
  963. #endif
  964.  
  965.   WORD     ob_x, ob_y, ob_width, ob_height, cobj;
  966.   BOOLEAN changed;
  967.   MFDB     s, d;
  968.   BITBLK  *bitblk;
  969.   WORD     pxy [10];
  970.   WORD     index [2];
  971.   GRECT    r;
  972.  
  973.   ob_x        = pb->pb_x;
  974.   ob_y        = pb->pb_y;
  975.   ob_width  = pb->pb_w;
  976.   ob_height = pb->pb_h;
  977.   changed    = (pb->pb_currstate ^ pb->pb_prevstate) & SELECTED;
  978.  
  979.   set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  980.  
  981.   if (! changed) /* it was an objc_draw, so draw box */
  982.   {
  983.      vsf_interior(userhandle,FIS_SOLID);
  984.      vsf_perimeter (userhandle, TRUE);
  985.     vswr_mode (userhandle, MD_TRANS);
  986.  
  987.      pxy [0] = ob_x+2;
  988.      pxy [1] = ob_y+2;
  989.      pxy [2] = ob_x+2 + ob_width - 1;
  990.      pxy [3] = ob_y+2 + ob_height - 1;
  991.      vsf_color (userhandle, BLACK);
  992.      v_bar (userhandle, pxy);
  993.  
  994.      pxy [0] = ob_x;
  995.      pxy [1] = ob_y;
  996.      pxy [2] = ob_x + ob_width  - 1;
  997.      pxy [3] = ob_y + ob_height - 1;
  998.      vsf_color (userhandle, WHITE);
  999.      v_bar (userhandle, pxy);
  1000.  
  1001.      vsl_type (userhandle, SOLID);
  1002.      vsl_ends (userhandle, SQUARED, SQUARED);
  1003.      vsl_width (userhandle, 1);
  1004.      vsl_color (userhandle, BLACK);
  1005. /*
  1006.     vswr_mode (userhandle, MD_REPLACE);
  1007. */
  1008.      pxy [0] = ob_x;
  1009.      pxy [1] = ob_y;
  1010.      pxy [2] = ob_x + ob_width - 1;
  1011.      pxy [3] = ob_y;
  1012.      pxy [4] = pxy [2];
  1013.      pxy [5] = ob_y + ob_height - 1;
  1014.      pxy [6] = ob_x;
  1015.      pxy [7] = pxy [5];
  1016.      pxy [8] = ob_x;
  1017.      pxy [9] = ob_y;
  1018.      v_pline (userhandle, 5, pxy);
  1019.  
  1020.   } /* if */
  1021.   switch(norm_point)
  1022.   {
  1023.      case 9:
  1024.         cobj=CIRCLEL;
  1025.         break;
  1026.      case 10:
  1027.              if(pb->pb_currstate & DISABLED)
  1028.                 cobj=CIRCLEHDIS;
  1029.            else
  1030.                 cobj=CIRCLEH;
  1031.         break;
  1032.      case 20:
  1033.         cobj=CIRCLEB;
  1034.         break;
  1035.      default:
  1036.              if(pb->pb_currstate & DISABLED)
  1037.                 cobj=CIRCLEHDIS;
  1038.            else
  1039.                 cobj=CIRCLEH;
  1040.         break;
  1041.   }
  1042.   bitblk = (BITBLK *)userimg [cobj].ob_spec;
  1043.  
  1044.   d.mp  = NULL; /* screen */
  1045.   s.mp  = (VOID *)bitblk->bi_pdata;
  1046.   s.fwp = bitblk->bi_wb << 3;
  1047.   s.fh  = bitblk->bi_hl;
  1048.   s.fww = s.fwp/16;
  1049.   s.ff  = FALSE;
  1050.   s.np  = 1;
  1051.  
  1052.   pxy [0] = 0;
  1053.   pxy [1] = 0;
  1054.   pxy [2] = s.fwp - 1;
  1055.   pxy [3] = s.fh - 1;
  1056.   pxy [4] = ob_x + 1 + (ob_width-bitblk->bi_wb*8)/2-1;
  1057.   pxy [5] = ob_y + 1 + (ob_height-bitblk->bi_hl)/2-1;
  1058.   pxy [6] = ob_x + pxy [2];
  1059.   pxy [7] = ob_y + pxy [3];
  1060.  
  1061.   index [0] = BLACK;
  1062.   index [1] = WHITE;
  1063.  
  1064.   vrt_cpyfm (userhandle, MD_TRANS, pxy, &s, &d, index);     /* copy it */
  1065.  
  1066.   reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1067.  
  1068. #if MSDOS
  1069.   fardr_end ((pb->pb_currstate & ~ SELECTED) & ~ DISABLED);
  1070. #endif
  1071.  
  1072.   return ((pb->pb_currstate & ~ SELECTED) & ~ DISABLED);
  1073. } /* draw_circel */
  1074.  
  1075. /*****************************************************************************/
  1076. /* Zeichnet aktuellen Font                                                                    */
  1077. /*****************************************************************************/
  1078. #if MSDOS
  1079. LOCAL WORD draw_font ()
  1080. {
  1081.     PARMBLK *pb = fardr_start();
  1082. #else
  1083. LOCAL WORD CDECL draw_font (PARMBLK *pb)
  1084. {
  1085. #endif
  1086.     int ret;
  1087.     BOOLEAN selected, changed;
  1088.     WORD     pxyarray[4];
  1089.     char string[]="X";
  1090.     static int w=0;
  1091.  
  1092.     extern WINDOW *twp;
  1093.  
  1094.     selected  = pb->pb_currstate & SELECTED;
  1095.     changed    = (pb->pb_currstate ^ pb->pb_prevstate) & SELECTED;
  1096.  
  1097.    set_clip (twp->vdihandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1098.  
  1099.     if(!changed) /* ordinary objc_draw */
  1100.     {
  1101.         vswr_mode(twp->vdihandle,MD_TRANS);
  1102.         if(pb->pb_obj==FCHAR)
  1103.             if(vst_point(twp->vdihandle,5,&ret,&ret,&w,&ret)!=5)
  1104.             {
  1105.                 if(boxh>8)
  1106.                     vst_point(twp->vdihandle,norm_point,&ret,&ret,&w,&ret);
  1107.                 else
  1108.                     vst_point(twp->vdihandle,5,&ret,&ret,&w,&ret);
  1109.             }
  1110.         *string=pb->pb_obj-FCHAR;
  1111.         v_gtext(twp->vdihandle,pb->pb_x+w,pb->pb_y,string);
  1112.     }
  1113.     else          /* objc_change */
  1114.     {
  1115.       pxyarray[0]=pb->pb_x;
  1116.       pxyarray[1]=pb->pb_y;
  1117.       pxyarray[2]=pb->pb_x+pb->pb_w-1;
  1118.       pxyarray[3]=pb->pb_y+pb->pb_h-1;
  1119.         vswr_mode(twp->vdihandle,MD_XOR);
  1120.         if(selected)
  1121.         {
  1122.             vsf_color(twp->vdihandle,BLACK);
  1123.             vst_color(twp->vdihandle,WHITE);
  1124.             vr_recfl(twp->vdihandle,pxyarray);        /* markieren */
  1125.         }
  1126.         else
  1127.         {
  1128.             vsf_color(twp->vdihandle,WHITE);
  1129.             vst_color(twp->vdihandle,BLACK);
  1130.             vr_recfl(twp->vdihandle,pxyarray);        /* markieren */
  1131.         }
  1132.     }
  1133.  
  1134.    reset_clip (twp->vdihandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1135.  
  1136.  #if MSDOS
  1137.     fardr_end (pb->pb_currstate & ~ SELECTED);
  1138.  #endif
  1139.  
  1140.     return (pb->pb_currstate & ~ SELECTED);
  1141.  
  1142. } /* draw_font */
  1143. /*****************************************************************************/
  1144. /* Zeichnet Überschriftenunterstreichung                                                 */
  1145. /*****************************************************************************/
  1146. #if MSDOS
  1147. LOCAL WORD draw_uline ()
  1148. {
  1149.     PARMBLK *pb = fardr_start();
  1150. #else
  1151. LOCAL WORD CDECL draw_uline (PARMBLK *pb)
  1152. {
  1153. #endif
  1154.     int x, cw, ch, width, ret, pxy[4], pxyarray[4];
  1155.  
  1156.    set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1157.  
  1158.     vst_color (userhandle, BLACK);
  1159.     vswr_mode (userhandle, MD_TRANS);
  1160.     vst_alignment(userhandle,0,5,&ret,&ret); /* Ausrichtung */
  1161.     vst_point(userhandle,norm_point,&ret,&ret,&cw,&ch);
  1162.     switch(((TEDINFO *)pb->pb_parm)->te_just)
  1163.     {
  1164.         case TE_LEFT:
  1165.             x=pb->pb_x;
  1166.             break;
  1167.         case TE_RIGHT:
  1168.             x=pb->pb_x+pb->pb_w-strlen((char *)((TEDINFO *)pb->pb_parm)->te_ptext)*cw;
  1169.             break;
  1170.         case TE_CNTR:
  1171.             x=pb->pb_x+(pb->pb_w-strlen((char *)((TEDINFO *)pb->pb_parm)->te_ptext)*cw)/2;
  1172.             break;
  1173.     }
  1174.  
  1175.     v_gtext(userhandle,x,pb->pb_y,(char *)((TEDINFO *)pb->pb_parm)->te_ptext);
  1176.     width=pb->pb_w+2;
  1177.  
  1178.     pxy[0]=pb->pb_x - 1;
  1179.     pxy[1]=pb->pb_y + pb->pb_h;
  1180.     pxy[2]=pb->pb_x - 1 + width - 1;
  1181.     pxy[3]=pxy[1];
  1182.     vswr_mode (userhandle, MD_REPLACE);
  1183.     vsl_color (userhandle, BLACK);
  1184.     v_pline(userhandle,2,pxy);
  1185.     pxy[1]++;
  1186.     pxy[3]++;
  1187.     vsl_color (userhandle, WHITE);
  1188.     v_pline(userhandle,2,pxy);
  1189.  
  1190.    reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1191.  
  1192.  #if MSDOS
  1193.     fardr_end (pb->pb_currstate);
  1194.  #endif
  1195.     return (pb->pb_currstate);
  1196.  
  1197. } /* draw_uline */
  1198. /*****************************************************************************/
  1199. /* Zeichnet Eselsohren                                                                        */
  1200. /*****************************************************************************/
  1201. #if MSDOS
  1202. LOCAL WORD draw_ear ()
  1203. {
  1204.     PARMBLK *pb = fardr_start();
  1205. #else
  1206. LOCAL WORD CDECL draw_ear (PARMBLK *pb)
  1207. {
  1208. #endif
  1209.     int pxy[8], pxyarray[4];
  1210.  
  1211.    set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1212.  
  1213.     vswr_mode (userhandle, MD_REPLACE);
  1214.     vsl_color (userhandle, BLACK);
  1215.     vsf_color(userhandle, dialbgcolor);
  1216.     vsf_perimeter(userhandle, TRUE);
  1217.     vsf_style(userhandle, 1);
  1218.     vsf_interior(userhandle, FIS_SOLID);
  1219.  
  1220.     pxy[0]=pb->pb_x;
  1221.     pxy[1]=pb->pb_y;
  1222.     pxy[2]=pb->pb_x + pb->pb_w - 1;
  1223.     pxy[3]=pb->pb_y + pb->pb_h - 1;
  1224.     pxy[4]=pb->pb_x;
  1225.     pxy[5]=pb->pb_y + pb->pb_h - 1;
  1226.     pxy[6]=pb->pb_x;
  1227.     pxy[7]=pb->pb_y;
  1228.     v_fillarea(userhandle,4,pxy);
  1229.     v_pline(userhandle,4,pxy);
  1230.  
  1231.     pxy[0]=pb->pb_x+3;
  1232.     pxy[1]=pb->pb_y+3;
  1233.     pxy[2]=pb->pb_x+3;
  1234.     pxy[3]=pb->pb_y + pb->pb_h - 1 - 3;
  1235.     pxy[4]=pb->pb_x + pb->pb_w - 1 - 3;
  1236.     pxy[5]=pb->pb_y + pb->pb_h - 1 - 3;
  1237.     v_pline(userhandle,3,pxy);
  1238.  
  1239.    reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1240.  
  1241.  #if MSDOS
  1242.     fardr_end (pb->pb_currstate);
  1243.  #endif
  1244.     return (pb->pb_currstate);
  1245.  
  1246. } /* draw_ear */
  1247. #if MSDOS
  1248. /*****************************************************************************/
  1249. /* Zeichnet disablete Trennlinien                                                          */
  1250. /*****************************************************************************/
  1251. #if MSDOS
  1252. LOCAL WORD draw_dline ()
  1253. {
  1254.     PARMBLK *pb = fardr_start();
  1255. #else
  1256. LOCAL WORD CDECL draw_dline (PARMBLK *pb)
  1257. {
  1258. #endif
  1259.     int xy[16];
  1260.  
  1261.     xy[ 4]=pb->pb_x;
  1262.     xy[ 5]=pb->pb_y+(pb->pb_h-1)/2;
  1263.     xy[ 6]=pb->pb_x+pb->pb_w-1;
  1264.     xy[ 7]=xy[5];
  1265.     xy[ 8]=xy[6];
  1266.     xy[ 9]=xy[7]+1;
  1267.     xy[10]=xy[4];
  1268.     xy[11]=xy[5]+1;
  1269.     xy[12]=xy[4];
  1270.     xy[13]=xy[5];
  1271.  
  1272.     vswr_mode(userhandle,MD_REPLACE);
  1273.     vsl_type (userhandle, SOLID);
  1274.     vsl_ends (userhandle, SQUARED, SQUARED);
  1275.     vsl_width (userhandle, 1);
  1276.     vsl_color (userhandle, BLACK);
  1277.     v_pline(userhandle,5,&xy[4]);
  1278.  
  1279.  #if MSDOS
  1280.     fardr_end (pb->pb_currstate);
  1281.  #endif
  1282.     return (pb->pb_currstate);
  1283. }
  1284. #endif
  1285. /*****************************************************************************/
  1286. /* Zeichnet 3Dbox                                                                                    */
  1287. /*****************************************************************************/
  1288. #if MSDOS
  1289. LOCAL WORD draw_3Dbox ()
  1290. {
  1291.     PARMBLK *pb = fardr_start();
  1292. #else
  1293. LOCAL WORD CDECL draw_3Dbox (PARMBLK *pb)
  1294. {
  1295. #endif
  1296.     int pxy[12];
  1297.     int ob_x,ob_y,ob_width,ob_height;
  1298.     
  1299.     ob_x      = pb->pb_x;
  1300.     ob_y      = pb->pb_y;
  1301.     ob_width  = pb->pb_w;
  1302.     ob_height = pb->pb_h;
  1303.     
  1304.    set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1305.  
  1306.     vswr_mode(userhandle,MD_REPLACE);
  1307.     vsl_type (userhandle, SOLID);
  1308.     vsl_ends (userhandle, SQUARED, SQUARED);
  1309.     vsl_width (userhandle, 1);
  1310.     vsl_color (userhandle, BLACK);
  1311.    vsf_interior(userhandle,FIS_SOLID); /* Füllung */
  1312.  
  1313.     pxy [0] = ob_x;
  1314.     pxy [1] = ob_y;
  1315.     pxy [2] = ob_x + ob_width - 1;
  1316.     pxy [3] = ob_y;
  1317.     pxy [4] = pxy [2];
  1318.     pxy [5] = ob_y + ob_height - 1;
  1319.     pxy [6] = ob_x;
  1320.     pxy [7] = pxy [5];
  1321.     pxy [8] = ob_x;
  1322.     pxy [9] = ob_y;
  1323.     v_pline (userhandle, 5, pxy);
  1324.  
  1325.     pxy[0]=ob_x+1;
  1326.     pxy[1]=ob_y+1;
  1327.     pxy[2]=ob_x+ob_width-3;
  1328.     pxy[3]=ob_y+ob_height-3;
  1329.     if(threedee) /*3D*/
  1330.         vsf_color(userhandle,dialbgcolor);          /* farbe  */
  1331.     else
  1332.         vsf_color(userhandle,WHITE);          /* farbe  */
  1333.     vr_recfl(userhandle,pxy);      /* weißes rechteck in workspace */
  1334.  
  1335.     if(threedee)
  1336.     {
  1337.         vsl_color (userhandle, WHITE);
  1338.         pxy [0] = ob_x + 1;
  1339.         pxy [1] = ob_y + ob_height - 2;
  1340.         pxy [2] = ob_x + 1;
  1341.         pxy [3] = ob_y + 1;
  1342.         pxy [4] = ob_x + ob_width - 2;
  1343.         pxy [5] = ob_y + 1;
  1344.         v_pline (userhandle, 3, pxy);
  1345.  
  1346.         vsl_color (userhandle, BLACK);
  1347.         pxy [0] = ob_x + ob_width - 2;
  1348.         pxy [1] = ob_y + 2;
  1349.         pxy [2] = ob_x + ob_width - 2;
  1350.         pxy [3] = ob_y + ob_height - 2;
  1351.         pxy [4] = ob_x + 2;
  1352.         pxy [5] = ob_y + ob_height - 2;
  1353.         v_pline (userhandle, 3, pxy);
  1354.  
  1355.         vsl_color (userhandle, WHITE);
  1356.         pxy [0] = ob_x + ob_width - 1;
  1357.         pxy [1] = ob_y + 1;
  1358.         pxy [2] = ob_x + ob_width - 1;
  1359.         pxy [3] = ob_y + ob_height - 1;
  1360.         pxy [4] = ob_x + 1;
  1361.         pxy [5] = ob_y + ob_height - 1;
  1362.         v_pline (userhandle, 3, pxy);
  1363.  
  1364.     }
  1365.    reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1366.  
  1367.  #if MSDOS
  1368.     fardr_end (pb->pb_currstate);
  1369.  #endif
  1370.     return (pb->pb_currstate);
  1371. }
  1372. /*
  1373. #if MSDOS
  1374. LOCAL WORD draw_3Dbox ()
  1375. {
  1376.     PARMBLK *pb = fardr_start();
  1377. #else
  1378. LOCAL WORD CDECL draw_3Dbox (PARMBLK *pb)
  1379. {
  1380. #endif
  1381.     int pxy[12];
  1382.     int ob_x,ob_y,ob_width,ob_height;
  1383.     
  1384.     ob_x      = pb->pb_x;
  1385.     ob_y      = pb->pb_y;
  1386.     ob_width  = pb->pb_w;
  1387.     ob_height = pb->pb_h;
  1388.     
  1389.    set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1390.  
  1391.     vswr_mode(userhandle,MD_REPLACE);
  1392.     vsl_type (userhandle, SOLID);
  1393.     vsl_ends (userhandle, SQUARED, SQUARED);
  1394.     vsl_width (userhandle, 1);
  1395.     vsl_color (userhandle, BLACK);
  1396.    vsf_interior(userhandle,FIS_SOLID); /* Füllung */
  1397.  
  1398.     pxy [0] = ob_x;
  1399.     pxy [1] = ob_y;
  1400.     pxy [2] = ob_x + ob_width - 1;
  1401.     pxy [3] = ob_y;
  1402.     pxy [4] = pxy [2];
  1403.     pxy [5] = ob_y + ob_height - 1;
  1404.     pxy [6] = ob_x;
  1405.     pxy [7] = pxy [5];
  1406.     pxy [8] = ob_x;
  1407.     pxy [9] = ob_y;
  1408.     v_pline (userhandle, 5, pxy);
  1409.  
  1410.     pxy[0]=ob_x+1;
  1411.     pxy[1]=ob_y+1;
  1412.     pxy[2]=ob_x+ob_width-3;
  1413.     pxy[3]=ob_y+ob_height-3;
  1414.     if(threedee) /*3D*/
  1415.         vsf_color(userhandle,dialbgcolor);          /* farbe  */
  1416.     else
  1417.         vsf_color(userhandle,WHITE);          /* farbe  */
  1418.     vr_recfl(userhandle,pxy);      /* weißes rechteck in workspace */
  1419.  
  1420.     if(threedee)
  1421.     {
  1422.         vsl_color (userhandle, WHITE);
  1423.         pxy [0] = ob_x + ob_width - 2;
  1424.         pxy [1] = ob_y + 1;
  1425.         pxy [2] = ob_x + ob_width - 2;
  1426.         pxy [3] = ob_y + ob_height - 2;
  1427.         pxy [4] = ob_x + 1;
  1428.         pxy [5] = ob_y + ob_height - 2;
  1429.         v_pline (userhandle, 3, pxy);
  1430.  
  1431.         vsl_color (userhandle, LBLACK);
  1432.         pxy [0] = ob_x + 1;
  1433.         pxy [1] = ob_y + ob_height - 2;
  1434.         pxy [2] = ob_x + 1;
  1435.         pxy [3] = ob_y + 1;
  1436.         pxy [4] = ob_x + ob_width - 2;
  1437.         pxy [5] = ob_y + 1;
  1438.         v_pline (userhandle, 3, pxy);
  1439.     }
  1440.    reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1441.  
  1442.  #if MSDOS
  1443.     fardr_end (pb->pb_currstate);
  1444.  #endif
  1445.     return (pb->pb_currstate);
  1446. }
  1447. */
  1448. /*
  1449. #if MSDOS
  1450. LOCAL WORD draw_3Dbox ()
  1451. {
  1452.     PARMBLK *pb = fardr_start();
  1453. #else
  1454. LOCAL WORD CDECL draw_3Dbox (PARMBLK *pb)
  1455. {
  1456. #endif
  1457.     int pxy[12];
  1458.     int ob_x,ob_y,ob_width,ob_height,viele_Farben;
  1459.     
  1460.     ob_x      = pb->pb_x;
  1461.     ob_y      = pb->pb_y;
  1462.     ob_width  = pb->pb_w;
  1463.     ob_height = pb->pb_h;
  1464.     
  1465.    set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1466.  
  1467.     vswr_mode(userhandle,MD_REPLACE);
  1468.     vsl_type (userhandle, SOLID);
  1469.     vsl_ends (userhandle, SQUARED, SQUARED);
  1470.     vsl_width (userhandle, 1);
  1471.     vsl_color (userhandle, BLACK);
  1472.    vsf_interior(userhandle,FIS_SOLID); /* Füllung */
  1473.    viele_Farben = mindestens_16_Farben();
  1474.  
  1475.    pxy [0] = ob_x;
  1476.     pxy [1] = ob_y + ob_height - 1;
  1477.     pxy [2] = ob_x;
  1478.     pxy [3] = ob_y;
  1479.     pxy [4] = ob_x + ob_width - 1;
  1480.     pxy [5] = ob_y;
  1481.     v_pline (userhandle, 3, pxy);
  1482.  
  1483.    if(threedee && viele_Farben)
  1484.         vsl_color (userhandle, WHITE);
  1485.  
  1486.     pxy [0] = ob_x + ob_width - 1;
  1487.     pxy [1] = ob_y + 1;
  1488.     pxy [2] = pxy [0];
  1489.     pxy [3] = ob_y + ob_height - 1;
  1490.     pxy [4] = ob_x + 1;
  1491.     pxy [5] = pxy [3];
  1492.     v_pline (userhandle, 3, pxy);
  1493.  
  1494.     pxy[0]=ob_x+1;
  1495.     pxy[1]=ob_y+1;
  1496.     pxy[2]=ob_x+ob_width-3;
  1497.     pxy[3]=ob_y+ob_height-3;
  1498.     if(threedee && viele_Farben) /*3D*/
  1499.         vsf_color(userhandle,dialbgcolor);          /* farbe  */
  1500.     else
  1501.         vsf_color(userhandle,WHITE);          /* farbe  */
  1502.     vr_recfl(userhandle,pxy);      /* weißes rechteck in workspace */
  1503.  
  1504.    reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1505.  
  1506.  #if MSDOS
  1507.     fardr_end (pb->pb_currstate);
  1508.  #endif
  1509.     return (pb->pb_currstate);
  1510. }
  1511. */
  1512. /*****************************************************************************/
  1513. /* Zeichnet selektierten Font in der Fontbox                                             */
  1514. /*****************************************************************************/
  1515. #if MSDOS
  1516. LOCAL WORD draw_selfont ()
  1517. {
  1518.     PARMBLK *pb = fardr_start();
  1519. #else
  1520. LOCAL WORD CDECL draw_selfont (PARMBLK *pb)
  1521. {
  1522. #endif
  1523.    int obx,oby,h,ret;
  1524.    int pxyarray[14];
  1525.  
  1526.     extern WINDOW *twp;
  1527.    extern int tid,tsize,tattr;
  1528.  
  1529.    pxyarray[10]=pb->pb_x;
  1530.    pxyarray[11]=pb->pb_y;
  1531.    pxyarray[12]=pb->pb_w;
  1532.    pxyarray[13]=pb->pb_h;
  1533.  
  1534.    if(rc_intersect(&pb->pb_xc,&pxyarray[10]))
  1535.    {
  1536.       set_clip (twp->vdihandle,pxyarray[10],pxyarray[11],pxyarray[12],pxyarray[13]);
  1537.  
  1538.       draw_3Dbox(pb);
  1539.       
  1540.       vst_font(twp->vdihandle,tid);
  1541.        if(tattr && (vq_vgdos()==0x5F46534D)) /* Vektor-GDOS */
  1542.           vst_arbpt(twp->vdihandle,tsize,&ret,&ret,&ret,&h);
  1543.        else
  1544.           vst_point(twp->vdihandle,tsize,&ret,&ret,&ret,&h);
  1545.       oby =  pb->pb_y;
  1546.       oby += (pb->pb_h - h)/2;
  1547.       vswr_mode(twp->vdihandle, MD_TRANS);
  1548.       v_gtext(twp->vdihandle,pb->pb_x+1,oby,"The quick brown fox jumps over the lazy dog.");
  1549.       vst_font(twp->vdihandle,twp->fontid);
  1550.       vst_point(twp->vdihandle,twp->fontsize,&ret,&ret,&ret,&ret);
  1551.       vswr_mode(twp->vdihandle, MD_REPLACE); /* zurückstellen */
  1552.  
  1553.       reset_clip (twp->vdihandle,pxyarray[10],pxyarray[11],pxyarray[12],pxyarray[13]);
  1554.    }
  1555.  #if MSDOS
  1556.     fardr_end (pb->pb_currstate);
  1557.  #endif
  1558.     return (pb->pb_currstate);
  1559. }
  1560.  
  1561. #if MSDOS
  1562. LOCAL WORD draw_tabbar ()
  1563. {
  1564.     PARMBLK *pb = fardr_start();
  1565. #else
  1566. LOCAL WORD CDECL draw_tabbar (PARMBLK *pb)
  1567. {
  1568. #endif
  1569.     int i, ret, viele_Farben;
  1570.     char *cp;
  1571.     int attrib[10], pxy [4];
  1572.     
  1573.     extern WINDOW *twp;
  1574.     
  1575.     set_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1576.  
  1577.     vqt_attributes(userhandle,attrib);
  1578.     vst_font(userhandle,twp->fontid);
  1579.     vst_point(userhandle,twp->fontsize,&ret,&ret,&ret,&ret);
  1580.     vst_alignment(userhandle,0,5,&ret,&ret); /* Zellenoberkante */
  1581.     vst_color(userhandle,BLACK);
  1582.     
  1583.     vsl_type (userhandle, SOLID);
  1584.     vsl_ends (userhandle, SQUARED, SQUARED);
  1585.     vsl_width (userhandle, 1);
  1586.     vsl_color (userhandle, BLACK);
  1587.     vsf_interior(userhandle,FIS_SOLID); /* Füllung */
  1588.    viele_Farben = mindestens_16_Farben();
  1589.     
  1590.     pxy[0]=pb->pb_x;
  1591.     pxy[1]=pb->pb_y;
  1592.     pxy[2]=pb->pb_x+pb->pb_w-1;
  1593.     pxy[3]=pb->pb_y+pb->pb_h-1;
  1594.  
  1595.     if(threedee && viele_Farben) /*3D*/
  1596.         vsf_color(userhandle,dialbgcolor);          /* farbe  */
  1597.     else
  1598.         vsf_color(userhandle,WHITE);          /* farbe  */
  1599.     vswr_mode(userhandle,MD_REPLACE);
  1600.     vr_recfl(userhandle,pxy);      /* rechteck in workspace */
  1601.     
  1602.     pxy[0]=pb->pb_x-twp->wscroll/2;      /* Trennlinie ziehen */
  1603.     pxy[1]=pb->pb_y-1;
  1604.     pxy[2]=pb->pb_x+pb->pb_w-1;
  1605.     pxy[3]=pb->pb_y-1;
  1606. /*
  1607.     vsl_color (userhandle, WHITE);
  1608. */
  1609.     v_pline(userhandle,2,pxy);
  1610. /*
  1611.     pxy[1]++;
  1612.     pxy[3]++;
  1613.     vsl_color (userhandle, BLACK);
  1614.     v_pline(userhandle,2,pxy);
  1615. */
  1616.     vswr_mode (userhandle, /*MD_REPLACE*/MD_TRANS); 
  1617.     cp=(char *)((TEDINFO *)pb->pb_parm)->te_ptext;
  1618.     if(cp[twp->umbruch-2] != ']')
  1619.     {
  1620.         for(i=1;i<STRING_LENGTH;i++)
  1621.             if(cp[i]==']')
  1622.             {
  1623.                 if( ! (i%twp->tab))
  1624.                     cp[i] = TABSIGN; /*Hütchen im Zeichensatz*/
  1625.                 else
  1626.                     cp[i] = '.';
  1627.                 break;
  1628.             }
  1629.         cp[twp->umbruch-2] = ']';
  1630.     }
  1631.     v_gtext(userhandle,pb->pb_x,pb->pb_y+(pb->pb_h-twp->hscroll)/2,&cp[twp->wfirst/twp->wscroll]);
  1632.     vst_font(userhandle,attrib[0]);
  1633.     vst_height(userhandle,attrib[7],&ret,&ret,&ret,&ret);
  1634.     
  1635.     reset_clip (userhandle, pb->pb_xc,pb->pb_yc,pb->pb_wc,pb->pb_hc);
  1636.  
  1637.  #if MSDOS
  1638.     fardr_end (pb->pb_currstate);
  1639.  #endif
  1640.     return (pb->pb_currstate);
  1641. }
  1642.  
  1643. /*****************************************************************************/
  1644. #define MAXUSERBLK (219+3+1) /* 3 Buttons in form_alert() + 1 Reserve */
  1645.  
  1646. static int userdefobjs=0;
  1647.  
  1648. USERBLK rs_userblk[MAXUSERBLK+1];
  1649.  
  1650. void tabbar_fix(WINDOW *wp)
  1651. {
  1652.     if(wp && wp->toolbar)
  1653.     {
  1654.         rs_userblk[userdefobjs].ub_code = draw_tabbar;
  1655.         rs_userblk[userdefobjs].ub_parm = wp->tabbar->ob_spec;
  1656.         wp->tabbar->ob_type = G_USERDEF;
  1657.         wp->tabbar->ob_spec = (LONG)&rs_userblk[userdefobjs++];
  1658. /*
  1659. printf("\33H%003d ",userdefobjs);
  1660. */
  1661.     }
  1662. }
  1663.  
  1664. void form_fix(OBJECT *tree, BOOLEAN is_dialog)
  1665. {
  1666.   WORD     obj;
  1667.   OBJECT  *ob;
  1668.   ICONBLK *ib;
  1669.   TEDINFO *ti;
  1670.   UWORD    type, xtype;
  1671. #if GEM & (GEM2 | GEM3 | XGEM)
  1672.   BYTE     *s;
  1673. #endif
  1674.  
  1675.   if (tree != NULL)
  1676.   {
  1677. #if GEM & (GEM2 | GEM3 | XGEM)
  1678.      if (is_dialog)
  1679.      {
  1680.         tree->ob_state&=~SHADOWED; /* Atari-like */
  1681.         tree->ob_state|=OUTLINED;
  1682.      } /* if */
  1683. #endif
  1684.  
  1685.      obj = 0;
  1686.  
  1687.      do
  1688.      {
  1689.         ob = &tree [++obj];
  1690.         type  = ob->ob_type & 0xFF;
  1691.         xtype = ob->ob_type >> 8;
  1692.  
  1693. #if MSDOS
  1694.         if ((type == G_STRING) && (ob->ob_state & DISABLED))
  1695.         {
  1696.           for (s = (BYTE *)ob->ob_spec; *s; s++)
  1697.              if (*s == 0x13)
  1698.              {
  1699.                  *s = '-';
  1700.                  xtype=DDLINE;
  1701.              }
  1702.         }
  1703. #endif
  1704.         if (threedee && (ob->ob_flags & EDITABLE) && mindestens_16_Farben())
  1705.         {  /* vertiefte Eingabefelder */
  1706. /*
  1707.             ob->ob_y-=2;
  1708.             ob->ob_height+=4;
  1709. */
  1710.             ob->ob_y--;
  1711.             ob->ob_height+=2;
  1712.             ob->ob_type  =G_FBOXTEXT;
  1713.             ob->ob_state|=SELECTED;
  1714.             ob->ob_flags|=FLAGS9;
  1715.             ob->ob_flags|=FLAGS10;
  1716.             ti = (TEDINFO *)ob->ob_spec;
  1717.  
  1718.             ti->te_thickness=0;
  1719.  
  1720.             ti->te_just=TE_CNTR;
  1721.             ti->te_color=0x11F0;
  1722.         }
  1723.  
  1724.         if (type == G_ICON)
  1725.         {
  1726.           ib = (ICONBLK *)ob->ob_spec;
  1727.           ob->ob_height = ib->ib_ytext + ib->ib_htext; /* Objekthöhe = Iconhöhe */
  1728.           trans_gimage (tree, obj);          /* Icons an Bildschirm anpassen */
  1729.         } /* if */
  1730.  
  1731.         if (type == G_IMAGE)
  1732.         {
  1733.           trans_gimage (tree, obj);          /* Bit Images an Bildschirm anpassen */
  1734.         } /* if */
  1735.  
  1736.         switch (xtype)
  1737.         {
  1738.           case DCHECKBOX  :
  1739.               rs_userblk[userdefobjs].ub_code      = draw_checkbox;
  1740.               rs_userblk[userdefobjs].ub_parm      = ob->ob_spec;
  1741.               ob->ob_type      = G_USERDEF;
  1742.               ob->ob_spec      = (LONG)&rs_userblk[userdefobjs++];
  1743.               break;
  1744.           case DRBUTTON    :
  1745.               rs_userblk[userdefobjs].ub_code      = draw_radio;
  1746.               rs_userblk[userdefobjs].ub_parm      = ob->ob_spec;
  1747.               ob->ob_type      = G_USERDEF;
  1748.               ob->ob_spec      = (LONG)&rs_userblk[userdefobjs++];
  1749.               break;
  1750.           case DALTBUTTON :
  1751.               rs_userblk[userdefobjs].ub_code      = draw_altbutton;
  1752.               rs_userblk[userdefobjs].ub_parm      = ob->ob_spec;
  1753.               ob->ob_type              = G_USERDEF;
  1754.               ob->ob_spec              = (LONG)&rs_userblk[userdefobjs++];
  1755.            ob->ob_x            -= 4;
  1756.            ob->ob_y            -= 5; /* 4 */
  1757.            ob->ob_width        += 8;
  1758.            ob->ob_height       += 10; /* 8 */
  1759.            ob->ob_flags      |= FLAGS14; /* wg. '*' im Dialog */
  1760.               if(!threedee)
  1761.               {
  1762.                ob->ob_y++;
  1763.                ob->ob_height-=2;
  1764.               }
  1765.               break;
  1766.           case DULINE      :
  1767.               rs_userblk[userdefobjs].ub_code      = draw_uline;
  1768.               rs_userblk[userdefobjs].ub_parm      = ob->ob_spec;
  1769.               ob->ob_type               = G_USERDEF;
  1770.               ob->ob_spec               = (LONG)&rs_userblk[userdefobjs++];
  1771.               break;
  1772.           case DHEADER       :
  1773.                 ob->ob_y                 -= boxh / 2;
  1774.               break;
  1775.           case DFONT        :
  1776.               font_blk.ub_code       = draw_font;
  1777.               font_blk.ub_parm       = ob->ob_spec;
  1778.               ob->ob_type               = G_USERDEF;
  1779.               ob->ob_spec               = (LONG)&font_blk;
  1780.               break;
  1781.           case DEAR         :
  1782.               ear_blk.ub_code        = draw_ear;
  1783.               ear_blk.ub_parm           = ob->ob_spec;
  1784.               ob->ob_x                 -= 3;
  1785.               ob->ob_y                 -= 3;
  1786.               ob->ob_width             = ob->ob_height;
  1787. if(boxh<=8)
  1788.     ob->ob_width=2*ob->ob_height;
  1789.               ob->ob_width             += 6;
  1790.               ob->ob_height         += 6;
  1791.               ob->ob_type               = G_USERDEF;
  1792.               ob->ob_state             &= ~OUTLINED;
  1793.               ob->ob_flags             |= TOUCHEXIT;
  1794.               ob->ob_flags             &= ~SELECTABLE;
  1795.               ob->ob_flags             &= ~EXIT;
  1796.               ob->ob_spec               = (LONG)&ear_blk;
  1797.               break;
  1798.           case DCIRCLE     :
  1799.               circle_blk.ub_code  = draw_circle;
  1800.               circle_blk.ub_parm  = ob->ob_spec;
  1801.               ob->ob_x                -= 1;
  1802.               ob->ob_y                 -= 1;
  1803.               ob->ob_width             += 2;
  1804.               ob->ob_height         += 2;
  1805.               ob->ob_type            = G_USERDEF;
  1806.               ob->ob_flags           |= TOUCHEXIT;
  1807.               ob->ob_spec            = (LONG)&circle_blk;
  1808.               break;
  1809.           case DDLINE      :
  1810. #if GEMDOS
  1811.               ob->ob_type           &= 0x00FF;
  1812. #else
  1813.               dline_blk.ub_code   = draw_dline;
  1814.               dline_blk.ub_parm   = ob->ob_spec;
  1815.               ob->ob_type            = G_USERDEF;
  1816.               ob->ob_spec            = (LONG)&dline_blk;
  1817. #endif
  1818.               break;
  1819.           case DSELFONT    :
  1820.               selfont_blk.ub_code = draw_selfont;
  1821.               selfont_blk.ub_parm = ob->ob_spec;
  1822.               ob->ob_type            = G_USERDEF;
  1823.               ob->ob_spec            = (LONG)&selfont_blk;
  1824.            ob->ob_x              -= 1;
  1825.            ob->ob_y               -= 1;
  1826.            ob->ob_width          += 2;
  1827.            ob->ob_height         += 2;
  1828.               break;
  1829.           case D3DBOX     :
  1830.               threeDbox_blk.ub_code   = draw_3Dbox;
  1831.               threeDbox_blk.ub_parm   = ob->ob_spec;
  1832.               ob->ob_type            = G_USERDEF;
  1833.               ob->ob_spec            = (LONG)&threeDbox_blk;
  1834.            ob->ob_x              -= 1;
  1835.            ob->ob_y               -= 1;
  1836.            ob->ob_width          += 2;
  1837.            ob->ob_height         += 2;
  1838.            ob->ob_flags       |= FLAGS15; /* wg. draw_altbutton() */
  1839.              break;
  1840.         } /* switch */
  1841. /*
  1842. printf("\33H%003d ",userdefobjs);
  1843. */
  1844.         if(userdefobjs>MAXUSERBLK)
  1845.         {
  1846.             Bconout(2,7);
  1847.             Cconws("\rNot enough memory to support USERDEFs!\r\nPress any key to abort...");
  1848.             while(!kbhit())
  1849.                 ;
  1850.             _exit(-1);
  1851.         }
  1852.      } while (! (ob->ob_flags & LASTOB));
  1853.   } /* if */
  1854. } /* fix_objs */
  1855.  
  1856.